/**
 * @author ludo
 */


/* Área de constantes */


/* Clase para el mapa.  */
var Mapa = function(pmdivMapa)
{	
	this.name = "Mapa";
	// Div donde se creará el mapa
	this.divMapa = pmdivMapa;
	// Objeto que contendrá el google maps
	this.map;
	// El marker manager, para no mostrarlo uno a uno
	this.markerManager;
	
	
	// Icono base
	
	this.baseIcon = new GIcon();
	this.baseIcon.shadow = "http://www.google.com/mapfiles/shadow50.png";
	this.baseIcon.iconSize = new GSize(20, 34);
	this.baseIcon.shadowSize = new GSize(37, 34);
	this.baseIcon.iconAnchor = new GPoint(9, 34);
	this.baseIcon.infoWindowAnchor = new GPoint(9, 2);
	this.baseIcon.infoShadowAnchor = new GPoint(18, 25);


	
	
	// Inicializador
	Mapa.prototype.initizalize = function()
	{
			this.map = new GMap2(_gel(this.divMapa), {mapTypes: [G_NORMAL_MAP, G_SATELLITE_MAP]});
			this.map.addControl(new GSmallMapControl());
			this.map.addControl(new GMapTypeControl());
			this.map.setCenter(new GLatLng(40.41667, -3.70355), 1);
			new GKeyboardHandler(this.map);
			this.map.enableScrollWheelZoom();
			this.map.enableDoubleClickZoom();
				
	}
	
	
	Mapa.prototype.drawDestacados = function(objXML){
		function crearMarcador(coordinates,baseIcon){
			
			var latlng = coordinates.split(" ");
			lat = latlng[0];
			lng = latlng[1];
			var point = new GPoint(lng, lat);			
			var thumbIcon = new GIcon(baseIcon);
			thumbIcon.image = "http://www.google.com/mapfiles/marker.png";
			var markerOptions = {
				icon: thumbIcon
			};
			
			
			var marker = new GMarker(point, markerOptions);
		    GEvent.addListener(marker, "click", function() {
            	marker.openInfoWindowHtml("Marker<br>Marker<br>Marker<br>Marker<br>Marker<br><br>Marker<br>Marker<br>Marker<br>");
          	});
			return marker;
		}
		
		
		this.markerManager = new GMarkerManager(this.map);
		var entries = objXML.getElementsByTagName("entry");
		var arrMarkers = new Array();
		for (var i=0;i<=entries.length-1;i++) {
			try {
				coordinates = entries[i].getElementsByTagName("gml:pos")[0].firstChild.nodeValue;
			} 
			catch (error) {
				coordinates = null;
			}
			finally
			{
				if (coordinates != null) {

					this.map.addOverlay(crearMarcador(coordinates,this.baseIcon));
				}				
			}
		}
	}
}

// Clase para las comunicaciones
var Comunicaciones = function(pmparent)
{
	this.name = "Comunicaciones;"
	this.parent = parent;
	
	this.minutosCache = 30;
	
	// URL de los destacados
	this.URI_DESTACADOS = "http://gdata.youtube.com/feeds/api/standardfeeds/recently_featured?location=!";
	//this.URI_DESTACADOS = "http://www.youtube.com/api2_rest?method=youtube.videos.list_recent_geotagged";
	// URL de los recientes
	// Con la api nueva, no consigo encontrar la llamada a que devuelva los videos nuevos geotageados
	this.URI_RECIENTES = "http://gdata.youtube.com/feeds/api/standardfeeds/most_recent?location=!";

	//this.URI_RECIENTES = "http://www.youtube.com/api2_rest?method=youtube.videos.list_recent_geotagged";
	
	// Total de videos a cargar en destacados
	this.TOTAL_NEWS_DESTACADOS = 20;
	// Total de videos a cargar en recientes
	this.TOTAL_NEWS_RECIENTES = 20;
	
	
	// Función que lee los destacados
	Comunicaciones.prototype.loadDestacados = function()
	{
		_IG_FetchXmlContent(this.URI_DESTACADOS, this.onLoadDestacados,{ refreshInterval: 60 * this.minutosCache});
	}
	
	// Función que lee los recientes
	Comunicaciones.prototype.loadRecientes = function()
	{
		_IG_FetchXmlContent(this.URI_RECIENTES, this.onLoadDestacados,{ refreshInterval: 60 * this.minutosCache});
	}	
	
	// Función que despacha el objeto JSON de destacados
	Comunicaciones.prototype.onLoadDestacados = new Function();
	// Función que despacha el objeto JSON de recientes	
	Comunicaciones.prototype.onLoadRecientes = new Function();	
}


	
var APP = function(pmdivMapa)
{
	this.name = "APP";
	this.objDestacados = null;
	this.objRecientes = null;
	this.mapa;
	
	// Función que muestra la "ventana" de error
	APP.prototype.muestraError = function(error)
	{
		// Aquí lanzamos el error
	}
		
	
	// Creamos el objeto Comunicaciones
	this.comunicaciones = new Comunicaciones(this);
		
	// Introducimos la función que se ejecutará al cargar los destacados
	// Función que despacha el objeto XML de destacados. OJO, no tengo NI IDEA de como conseguir el objeto APP, así que lo tengo que llamar desde aquí :(
	this.comunicaciones.onLoadDestacados = function(objXML)
	{

		// Si es erróneo, muestra el error y para la ejecución
		if(objXML == null) 
		{
			app.muestraError("Error al recuperar los videos destacados.\nInténtelo de nuevo más tarde.")
			return
		}
		else
		{
			app.objDestacados = objXML;
			app.mapa.drawDestacados(app.objDestacados);
		} 
	}
	

	// Hacemos la carga de destacados
	this.comunicaciones.loadDestacados();
	
	// En paralelo, creamos el mapa
	this.mapa = new Mapa(pmdivMapa);
	this.mapa.initizalize();
	

		
		
}
